home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 001-010 / amok03 / ifftocode / doc < prev    next >
Encoding:
Text File  |  1993-11-04  |  8.0 KB  |  301 lines

  1. (*---------------------------------------------------------------------------
  2.     :Program.    IFFtoCode.mod / IFFtoSprIm
  3.     :Author.     Pit Burkhardt
  4.     :Address.    Stettinerstraße 25, D-7030 Böblingen
  5.     :Phone.      ----
  6.     :Shortcut.   [pit]
  7.     :Version.    0.1
  8.     :Date.       19.05.88
  9.     :Copyright.  PD
  10.     :Language.   Modula-II
  11.     :Translator. M2Amiga
  12.     :Imports.    LoadIFF.mod [fbs] of Amok#1, UpDate on Amok#2.
  13.     :UpDate.     none.
  14.     :Contents.   Umwandlung von IFF-Bildern in M2-Source-Code für ImageData.
  15.     :Remark.     Thanks to Fridjoff for his IFF-loading-module
  16. ---------------------------------------------------------------------------*)
  17.  
  18. - DOKUMENTATION: IFFtoCode, IFFtoSprIm
  19.  
  20. Es ist jetzt nicht mehr nötig auf Millimeterpapier gezeichnete Images in 
  21. Hex-Zahlen umzurechnen! Gut, was?!
  22. Denn IFFtoCode/IFFtoSprIm generiert Modula-2-Source-Code aus IFF-Dateien 
  23. beliebiger Breite, Höhe und Tiefe. 
  24.  
  25.  
  26. * Der Unterschied zwischen beiden Tools:
  27.  
  28.  
  29. IFFtoCode generiert M2Source für Images (Intuition) und Bobs (Graphics)
  30.  
  31. IFFtoSprIm generiert M2Source für Hardware-Sprites und VSprites. Deren 
  32. Image-Daten sind anders organisiert, außerdem sind Sprites generell 
  33. 16 Pixel breit und 2 Planes tief. Das Programm berücksichtigt diese 
  34. Einschränkungen. 
  35.  
  36. (im folgenden wird überwiegend von IFFtoCode die Rede sein, analoges gilt 
  37. dann auch für IFFtoSprIm)
  38.  
  39.  
  40. * Wie geht das? 
  41.  
  42.  
  43. Ganz einfach: Die Images werden in D-Paint gezeichnet und als 
  44. Brush abgespeichert. IFFtoXXX verwendet den Namen des Brushes als 
  45. Feldname und schreibt die Deklaration der Feldelemente. 
  46.  
  47. das Programm IFFtoCode bearbeitet natürlich auch ganze IFF-Bilder es ist 
  48. aber kaum sinnvoll ganze IFF-Bilder als Code zu installieren weil dies zum 
  49. einen eine Riesenmenge an SourceCode bedeutet, zum zweiten bei Bildern mit 
  50. mehr als 32k vom M2Compiler nicht mehr in einem Modul verarbeitet wird und 
  51. drittens hat Fridtjof [fbs] ja einen IFF-Lader geschrieben!                  
  52.  
  53.  
  54. * Ausführung der Tools 
  55.  
  56.  
  57. Die Programme werden folgendermaßen gestartet.
  58.  
  59. Von der Workbench: IFF-Datei-Icon(s) <SHIFT>-klicken dann IFFtoCode-Icon 
  60.            <SHIFT>-doppelklicken.    
  61.  
  62. CLI-Aufruf:       IFFtoCode Brushname1 Brushname2 ... BrushnameN
  63.                         
  64. Das Programm erwartet dann die Eingabe eines Dateinamens für die Ausgabe-
  65. Datei, in die der Source-Code geschrieben werden soll. (Die Ausgabe-Datei 
  66. wird nicht mit einem Icon versehen!) Wird nur <RETURN> eingegeben, dann wird 
  67. der Source-Code ins Ausgebefenster geschrieben.
  68.  
  69. Mit <CTRL>-C oder durch Anklicken des Closing-Gadgets kann das Programm 
  70. jederzeit abgebrochen werden.           
  71.  
  72.  
  73. * Verwendung mehrerer Images in einem Modul
  74.  
  75.  
  76. Die Pointer auf die einzelnen Image-Daten werden als ARRAY definiert, wenn 
  77. mehr als ein Brush auf einmal durch IFFtoCode bearbeitet wird und dadurch 
  78. mehrere Images in einem Modul abgelegt werden.
  79.  
  80. Die Eingabe mehrerer Brushes ist aber nur dann sinnvoll, wenn alle Brushes 
  81. die gleiche Größe und Tiefe haben. Breite und Höhe werden für alle Brushes 
  82. am ersten eingelesenen Brush orientiert. Das untenstehende Beispiel zeigt, 
  83. wie der generierte Code aussieht.
  84.  
  85.  
  86. * Was ist am erzeugten Code noch zu tun?
  87.  
  88.  
  89. Sie wollen Daten für VSprites mit Hilfe von IFFtoSprIm erzeugen? OK, aber 
  90. VSprite-Image-Daten sind etwas anders aufgebeut als Image-Daten von 
  91. Hardware-Sprites. Letztere benötigen in ihren Image-Daten noch Felder für 
  92. spezielle Zwecke, ihre ImageDaten sind wie folgt aufgebaut: 
  93.  
  94. TYPE    Img=RECORD
  95.           Pos:ARRAY [0..1] OF WORD;
  96.           Dat:ARRAY [0..n] OF WORD; --> Hier liegen die eigentlichen Daten
  97.           Add:ARRAY [0..1] OF WORD;
  98.         END;
  99.  
  100. IFFtoSprIm erzeugt die obige Struktur im DEFINITION-Teil. Da sie von 
  101. VSprites nicht verstanden wird, sollte sie für diese wie folgt abgeändert 
  102. werden:
  103.  
  104. TYPE    Img=RECORD
  105.           Dat:ARRAY [0..49] OF WORD;
  106.         END;
  107.  
  108. Ja, ganz recht, das ist alles (es müssen lediglich zwei Zeilen gelöscht 
  109. werden), jedenfalls fast, denn jetzt müssen natürlich noch die 
  110. entsprechenden Initialisierungen im IMPLEMENTATION MODULE gelöscht werden
  111. (Img.Pos und Img.Add existieren ja nicht mehr, dürfen also auch nicht mehr 
  112. initialisiert werden).
  113.  
  114. ACHTUNG: Habe einen Fehler entdeckt: Manchmal stimmt die für Img.Dat 
  115. deklarierte Feldgröße nicht mit der tatsächlichen Anzahl an Feldelementen 
  116. überein. Vorsichtshalber im IMPLEMENTATION-Teil nachschauen, welche Nummer 
  117. das letzte Feldelement besitzt und die Deklaration entsprechend abändern.
  118.   
  119. Der erzeugte Code muß vor dem Compilieren noch zweigeteilt werden:
  120. Der DEFINITION-Teil muß als getrennte Datei abgespeichert und zuerst 
  121. compiliert werden (.def). Jetzt kann der IMPLEMENTATION-Teil compiliert 
  122. werden (.mod). 
  123.  
  124.  
  125. * Importieren der Image-Daten
  126.  
  127.  
  128. Die IM IMPLEMENTATION-MODULE vereinbarten Variablen ...
  129.  
  130.         Imgwidth   :INTEGER;
  131.         Imgheight  :INTEGER;
  132.         Imgdepth   :INTEGER;
  133.         
  134.         ImgPtr     :POINTER TO Img;
  135.         bzw.
  136.         ImgPtr     :ARRAY [0..  n] OF POINTER TO Img;
  137.  
  138. können im RECORD Image (Intuition) direkt an die Variablen ... 
  139.     
  140.         width 
  141.     height 
  142.     depth  
  143.     ImageData
  144.                            
  145. übergeben werden. Ist ImgPtr als "ARRAY [0..  n] OF POINTER TO Img" 
  146. vereinbart, so sollten auch die Konstanten "Brushname1 Brushname2 ... 
  147. ...BrushnameN" importiert werden und an ImageData sollte ImgPtr[Brushname] 
  148. übergeben werden.
  149.  
  150. Für IFFtoSprIm fallen die Variablen Imgwidth und Imgplanes weg. alles 
  151. andere analog.         
  152.  
  153. Das untenstehende Beispiel zeigt die Variablenübergabe  
  154.  
  155.  
  156. * BeispielCode
  157.  
  158.  
  159. Der folgende Code wurde aus 2 IFF-Brushes mit den Namen "Brush1" und 
  160. "Pinsel" vom Programm IFFtoCode erzeugt:
  161.  
  162. ========================================================================
  163.  
  164.           (* -------> DEFINITION MODULE <-------- *)
  165.  
  166. DEFINITION MODULE Img;
  167.  
  168. FROM SYSTEM IMPORT      WORD;
  169.  
  170. FROM Heap IMPORT        AllocMem;
  171.  
  172. TYPE    Img=RECORD
  173.           Dat:ARRAY [0..17] OF WORD;
  174.         END;
  175.  
  176.  
  177. CONST   Brush1=  0;
  178.         Pinsel=  1;
  179.         
  180.  
  181. VAR     Imgwidth   :INTEGER;
  182.         Imgheight  :INTEGER;
  183.         Imgdepth   :INTEGER;
  184.         ImgPtr     :ARRAY [0..  1] OF POINTER TO Img;
  185.  
  186.  
  187. END Img.
  188.  
  189.           (* -------> IMPLEMENTATION MODULE <-------- *)
  190.  
  191. IMPLEMENTATION MODULE Img;
  192.  
  193. FROM SYSTEM IMPORT      WORD;
  194.  
  195. FROM Heap IMPORT        AllocMem;
  196.  
  197. VAR     i   :INTEGER;
  198.  
  199.  
  200.  
  201. BEGIN   (* MAIN *)
  202.  
  203. FOR i:=0 TO   1  DO
  204.   AllocMem(ImgPtr[i],SIZE(ImgPtr[i]^),TRUE);
  205. END;
  206.  
  207. Imgwidth := 16;
  208. Imgheight:=  9;
  209. Imgdepth :=  2;
  210.  
  211.  
  212.  
  213. WITH ImgPtr[Brush1]^ DO         (* Brush1 *)
  214.  
  215.   (* Plane 1 *)
  216.  Dat[ 0]:=0FFFFH;(* 1*)
  217.  Dat[ 1]:=0C0FFH;(* 2*)
  218.  Dat[ 2]:=0CCFFH;(* 3*)
  219.  Dat[ 3]:=0C003H;(* 4*)
  220.  Dat[ 4]:=0FCF3H;(* 5*)
  221.  Dat[ 5]:=0FCF3H;(* 6*)
  222.  Dat[ 6]:=0FCF3H;(* 7*)
  223.  Dat[ 7]:=0FC03H;(* 8*)
  224.  Dat[ 8]:=0FFFFH;(* 9*)
  225.  
  226.   (* Plane 2 *)
  227.  Dat[ 9]:=00000H;(* 1*)
  228.  Dat[10]:=00000H;(* 2*)
  229.  Dat[11]:=00000H;(* 3*)
  230.  Dat[12]:=00000H;(* 4*)
  231.  Dat[13]:=00000H;(* 5*)
  232.  Dat[14]:=00000H;(* 6*)
  233.  Dat[15]:=00000H;(* 7*)
  234.  Dat[16]:=00000H;(* 8*)
  235.  Dat[17]:=00000H;(* 9*)
  236.  
  237. END; 
  238.  
  239.  
  240. WITH ImgPtr[Pinsel]^ DO         (* Pinsel *)
  241.  
  242.   (* Plane 1 *)
  243.  Dat[ 0]:=0FFFFH;(* 1*)
  244.  Dat[ 1]:=0C0FFH;(* 2*)
  245.  Dat[ 2]:=0CCFFH;(* 3*)
  246.  Dat[ 3]:=0C003H;(* 4*)
  247.  Dat[ 4]:=0FCF3H;(* 5*)
  248.  Dat[ 5]:=0FCF3H;(* 6*)
  249.  Dat[ 6]:=0FCF3H;(* 7*)
  250.  Dat[ 7]:=0FC03H;(* 8*)
  251.  Dat[ 8]:=0FFFFH;(* 9*)
  252.  
  253.   (* Plane 2 *)
  254.  Dat[ 9]:=00000H;(* 1*)
  255.  Dat[10]:=00000H;(* 2*)
  256.  Dat[11]:=00000H;(* 3*)
  257.  Dat[12]:=00000H;(* 4*)
  258.  Dat[13]:=00000H;(* 5*)
  259.  Dat[14]:=00000H;(* 6*)
  260.  Dat[15]:=00000H;(* 7*)
  261.  Dat[16]:=00000H;(* 8*)
  262.  Dat[17]:=00000H;(* 9*)
  263.  
  264. END; 
  265. END Img.
  266.  
  267. ==========================================================================
  268.  
  269.  
  270. * Beispiel Importliste
  271.  
  272. Die Importliste für das obige MODULE sollte wie folgt aussehen:
  273.  
  274. FROM Img IMPORT    Brush1,Pinsel,Imgwidth,Imgheight,Imgdepth,ImgPtr;    
  275.  
  276.  
  277. Die Übergabe an den RECORD vom TYPE Image sieht für das Image mit dem 
  278. Namen Brush1 so aus:
  279.  
  280. WITH ImageType DO
  281.   leftEdge    :=
  282.   topEdge    :=
  283.   width        :=Imgwidth;
  284.   height    :=Imgheight;
  285.   depth        :=ImgDepth;
  286.   imageData    :=ImgPtr[Brush1]
  287.   planePick    :=
  288.   planeOnOff    :=
  289.   nextImage    :=
  290. END;
  291.  
  292.  
  293.  
  294.  
  295. Für Anfragen stehe ich gerne zur Verfügung.
  296.  
  297. Ich wünsche viel Spaß mit IFFtoCode ...
  298.  
  299.                 
  300.                                 ... Pit Burkhardt
  301.